/*
 *                   江城子 . 程序员之歌
 *
 *               十年生死两茫茫，写程序，到天亮。
 *                   千行代码，Bug何处藏。
 *               纵使上线又怎样，朝令改，夕断肠。
 *
 *               领导每天新想法，天天改，日日忙。
 *                   相顾无言，惟有泪千行。
 *               每晚灯火阑珊处，夜难寐，加班狂。
 *
 */

/*
 * @Author: fengshan0525 2735332396@qq.com
 * @Date: 2023-03-19 09:38:33
 * @LastEditors: fengshan@0525 3183359488@qq.com
 * @LastEditTime: 2023-07-26 15:11:57
 * @FilePath: \nest-template\libs\db\src\models\role.model.ts
 * @Description: 角色模型
 */

import { ApiProperty } from '@nestjs/swagger';
import { modelOptions, prop } from '@typegoose/typegoose';
import { MenuFields } from 'types/modelFields';
import {
  IsNotEmpty,
  IsOptional,
  IsInt,
  IsString,
  Allow,
} from 'class-validator';
import { AdminRoleMenu } from './role_menu.model';

// 只有在model中使用@prop() 装饰器装饰的属性，才会被存储到数据库中，
@modelOptions({
  // 自动为每个属性添加时间戳
  schemaOptions: {
    timestamps: true,
  },
})
export class AdminMenu implements MenuFields {
  @ApiProperty({ description: '路由地址', required: true })
  @IsNotEmpty({ message: '路由地址不能为空' })
  @prop()
  path: string;

  @ApiProperty({ description: '组件名称', required: true })
  @IsNotEmpty({ message: '路由地址不能为空' })
  @prop()
  name: string;

  @ApiProperty({ description: '组件地址', required: true })
  @IsNotEmpty({ message: '路由地址不能为空' })
  @prop()
  component: string;

  @ApiProperty({ description: 'meta', required: true })
  @IsOptional()
  @prop()
  meta: any;

  @ApiProperty({ description: '菜单id', required: true })
  @IsOptional()
  @prop()
  menuId: number;

  @ApiProperty({ description: '菜单类型(1:目录 2：菜单)', required: true })
  @IsNotEmpty({ message: '菜单类型不能为空' })
  @IsString()
  @prop()
  menuType: string;

  @ApiProperty({ description: '上级目录id', required: true })
  @IsNotEmpty({ message: '上级目录id不能为空' })
  @IsInt()
  @prop({ ref: () => AdminRoleMenu })
  parentId: number;

  @ApiProperty({ description: '排序' })
  @IsOptional()
  @prop()
  order: number;

  @ApiProperty({ description: '状态(0 停用 1 启用)' })
  @IsOptional()
  @IsString()
  @prop()
  status: string;

  @Allow()
  createdAt: string;

  @Allow()
  updatedAt: string;

  @ApiProperty({ description: '状态描述(0 停用 1 启用)' })
  @IsOptional()
  @IsString()
  @prop()
  statusDetail?: string;

  @Allow()
  index: number;

  @Allow()
  menuName: string;

  @Allow()
  icon: string;
}
